package br.ufpe.cin.ip.biblioteca.repositorios;

import br.ufpe.cin.ip.biblioteca.entidades.Usuario;
import br.ufpe.cin.ip.biblioteca.excecoes.UsuarioJaCadastradoException;
import br.ufpe.cin.ip.biblioteca.excecoes.UsuarioNaoEncontradoException;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorUsuario;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorUsuarioArray;

public class RepositorioUsuarioArray implements RepositorioUsuario {
	private Usuario[] usuarios;
	
	public RepositorioUsuarioArray() {
		super();
		this.usuarios = new Usuario[0];
	}
	
	@Override
	public void adicionar(Usuario usuario) throws UsuarioJaCadastradoException {
		if(this.existe(usuario)) {
			throw new UsuarioJaCadastradoException();
		} else {
			Usuario[] novoArray = new Usuario[this.usuarios.length + 1];
			
			for(int i=0; i<this.usuarios.length; i++) {
				novoArray[i] = this.usuarios[i];
			}
			
			novoArray[novoArray.length-1] = usuario;
			this.usuarios = novoArray;
		}
	}
	
	@Override
	public void remover(Usuario usuario) throws UsuarioNaoEncontradoException {
		int indiceRemover = -1;
		for(int i=0; i<this.usuarios.length; i++) {
			if(this.usuarios[i]!=null && this.usuarios[i].equals(usuario))
				indiceRemover = i;
		}
		
		if(indiceRemover>=0) {
			Usuario[] novoArray = new Usuario[this.usuarios.length - 1];
			
			for(int i=0; i<this.usuarios.length; i++) {
				if(i<indiceRemover) {
					novoArray[i] = this.usuarios[i];
				} else if(i>indiceRemover) {
					novoArray[i-1] = this.usuarios[i];
				}
			}
			
			this.usuarios = novoArray;
		} else {
			throw new UsuarioNaoEncontradoException();
		}
	}
	
	@Override
	public void atualizar(Usuario usuario) throws UsuarioNaoEncontradoException {
		Usuario retorno = null;
		
		for(Usuario u : this.usuarios) {
			if(usuario.equals(u))
				retorno = u;
		}
		
		if(retorno==null) {
			throw new UsuarioNaoEncontradoException();
		} else {
			retorno.setNome(usuario.getNome());
			retorno.setMatricula(usuario.getMatricula());
			retorno.setRG(usuario.getRG());
		}
	}
	
	@Override
	public Usuario buscar(Usuario usuario) throws UsuarioNaoEncontradoException {
		Usuario retorno = null;
		
		for(Usuario u : this.usuarios) {
			if(usuario.equals(u))
				retorno = u;
		}
		
		if(retorno==null) {
			throw new UsuarioNaoEncontradoException();
		} else {
			return retorno;
		}
	}
	
	@Override
	public IteratorUsuario getIterator() {
		return new IteratorUsuarioArray(this.usuarios);
	}
	
	@Override
	public boolean existe(Usuario usuario) {
		boolean retorno = false;
		
		for(Usuario u : this.usuarios) {
			if(usuario.equals(u))
				retorno = true;
		}
		
		return retorno;
	}
}
